package com.example.demo.common;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

/**
 * 密码工具类
 * 1. 密码加盐加密
 * 2. 密码加盐解密
 */
public class PasswordTools {
    /***
     * 加盐加密
     * @param password 明文密码
     * @return 加盐加密的密码
     */
    public static String encrypt(String password) {
        // 1. 产生盐值
        String salt = UUID.randomUUID().toString().replace("-",""); // 32 位
        // 2. 使用 (盐值+明文密码) 得到密码的密码
        String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 3. 将盐值和加密的密码共同返回(合并盐值和加密密码)
        String dbPassword = salt + "$" + finalPassword;
        return dbPassword;
    }

    public static String encrypt(String password, String salt) {
        // 1. 产生盐值
        //String salt = UUID.randomUUID().toString().replace("-",""); // 32 位
        // 2. 使用 (盐值+明文密码) 得到密码的密码
        String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // 3. 将盐值和加密的密码共同返回(合并盐值和加密密码)
        String dbPassword = salt + "$" + finalPassword;
        return dbPassword;
    }

    /**
     * 验证加盐加密密码
     * @param password 明文密码 (不一定对,需要验证明文密码)
     * @param dbPassword  数据库存储的密码(包含: salt + $ + 加盐加密密码)
     * @return true: 密码成功
     */

    public static boolean decrypt(String password, String dbPassword) {
        boolean result = false;
        if(StringUtils.hasLength(password) && StringUtils.hasLength(dbPassword) &&
            dbPassword.length() == 65 && dbPassword.contains("$")) { // 参数正确
            // 得到盐值
            String[] passwordArr = dbPassword.split("\\$");
            String salt = passwordArr[0];
            // 生成验证密码的加盐加密密码
            String checkPassword = encrypt(password, salt);
            if(checkPassword.equals(dbPassword)) {
                result = true;
            }
        }
        return result;
    }

    public static void main(String[] args) {
        BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();

        String password = "123456";
        String dbPassword = passwordEncoder.encode(password);
        String dbPassword2 = passwordEncoder.encode(password);
        String dbPassword3 = passwordEncoder.encode(password);
//        String dbPassword = PasswordTools.encrypt(password);
//        String dbPassword2 = PasswordTools.encrypt(password);
//        String dbPassword3 = PasswordTools.encrypt(password);
        System.out.println(dbPassword);
        System.out.println(dbPassword2);
        System.out.println(dbPassword3);

        String cPwd = "12345";
        boolean result = passwordEncoder.matches(cPwd,dbPassword);
        //boolean result = PasswordTools.decrypt(cPwd,dbPassword2);
        System.out.println("错误的对比: " + result);
        boolean result2 = passwordEncoder.matches(password,dbPassword);
        //boolean result2 = PasswordTools.decrypt(password,dbPassword2);
        System.out.println("正确的对比: " + result2);
    }
}
